package com.erbantou.filemanage.util;

import java.io.File;

public class FileUtils {

    // 定义转换系数常量，表示字节转换的系数
    private static final int BYTE_CONVERSION_FACTOR = 1024;

    // 定义文件大小单位数组，依次表示字节（B）、千字节（KB）、兆字节（MB）、千兆字节（GB）、太字节（TB）、拍字节（PB）、艾字节（EB）、泽字节（ZB）、尧字节（YB）
    private static final String[] FILE_SIZE_UNITS = new String[]{"B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};

    // 定义零字节的表示
    private static final String ZERO_SIZE = "0 B";

    /**
     * 将文件大小（以字节为单位）转换为人类可读的格式。
     *
     * @param size 文件大小（以字节为单位）
     * @return 文件大小的可读字符串表示
     */
    public static String convertToHumanReadableSize(long size) {
        // 如果文件大小小于等于0，返回 "0 B"
        if (size <= 0) return ZERO_SIZE;

        // 计算文件大小的对数，以 1024 为底数，通过换底公式即为 Math.log10(size) / Math.log10(1024)
        int digitGroups = (int) (Math.log10(size) / Math.log10(BYTE_CONVERSION_FACTOR));

        // 格式化文件大小，保留一位小数，并添加相应的单位
        return String.format("%.1f %s", size / Math.pow(BYTE_CONVERSION_FACTOR, digitGroups), FILE_SIZE_UNITS[digitGroups]);
    }

    public static void main(String[] args) {
        // 示例用法：创建一个文件对象，指定文件路径
        File file = new File("path/to/your/file");

        // 获取文件大小（以字节为单位）
        long fileSizeInBytes = file.length();

        // 将文件大小转换为人类可读的格式
        String humanReadableSize = convertToHumanReadableSize(fileSizeInBytes);

        // 输出文件大小的可读字符串表示
        System.out.println("文件大小: " + humanReadableSize);
    }
}
